/**
 * @file system_stm32h7xx.c
 * @brief CMSIS Cortex-M7设备外设访问层系统源文件
 * @author Flight Control Team
 * @date 2025-10-31
 */

#include "stm32h7xx.h"

/* System clock frequency (Core clock)
 * IMPORTANT: For FreeRTOS, this must be HCLK (AHB clock), not SYSCLK!
 * SYSCLK = 480MHz, HCLK = 240MHz (SYSCLK / 2)
 */
uint32_t SystemCoreClock = 240000000UL;  /* HCLK = 240MHz */
uint32_t SystemD2Clock = 240000000UL;    /* D2 domain clock = 240MHz */
const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};

/**
 * @brief 设置微控制器系统
 *        初始化FPU设置、中断向量表位置和外部存储器配置
 */
void SystemInit(void)
{
    /* FPU设置 */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 20) | (3UL << 22)); /* 设置CP10和CP11完全访问权限 */
#endif

    /* 复位RCC时钟配置到默认复位状态 */
    /* 设置HSION位 */
    RCC->CR |= RCC_CR_HSION;

    /* 复位CFGR寄存器 */
    RCC->CFGR = 0x00000000;

    /* 复位HSEON, CSSON, CSION, RC48ON, CSIKERON, PLL1ON, PLL2ON和PLL3ON位 */
    RCC->CR &= 0xEAF6ED7F;

    /* 复位D1CFGR寄存器 */
    RCC->D1CFGR = 0x00000000;

    /* 复位D2CFGR寄存器 */
    RCC->D2CFGR = 0x00000000;

    /* 复位D3CFGR寄存器 */
    RCC->D3CFGR = 0x00000000;

    /* 复位PLLCKSELR寄存器 */
    RCC->PLLCKSELR = 0x00000000;

    /* 复位PLLCFGR寄存器 */
    RCC->PLLCFGR = 0x00000000;

    /* 复位PLL1DIVR寄存器 */
    RCC->PLL1DIVR = 0x00000000;

    /* 复位PLL1FRACR寄存器 */
    RCC->PLL1FRACR = 0x00000000;

    /* 禁用所有中断 */
    RCC->CIER = 0x00000000;

    /* 配置中断向量表位置和偏移地址 */
#ifdef VECT_TAB_SRAM
    SCB->VTOR = SRAM1_BASE; /* 中断向量表重定位到内部SRAM */
#else
    SCB->VTOR = FLASH_BANK1_BASE; /* 中断向量表重定位到内部FLASH */
#endif
}

/**
 * @brief 根据时钟寄存器值更新SystemCoreClock变量
 *        SystemCoreClock变量包含核心时钟(HCLK)，用户应用程序可以使用它
 *        来设置SysTick定时器或配置其他参数
 * @note For STM32H7, SystemCoreClock should be HCLK (AHB clock), not SYSCLK
 */
void SystemCoreClockUpdate(void)
{
    /* After clock configuration:
     * SYSCLK = 480MHz (from PLL1)
     * HCLK = 240MHz (SYSCLK / 2, configured by D1CPRE divider)
     * SystemCoreClock must be set to HCLK for correct FreeRTOS timing */

    /* For our configuration: HCLK = 240MHz */
    SystemCoreClock = 240000000UL;
    SystemD2Clock = 240000000UL;
}